#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <crypt.h>
#include <string>
#include <cstring>
#include <iostream>
#include "Logger.h"
using namespace std;

namespace moqi
{

string genRandomSalt(size_t length = 8) // 生成一个指定长度的随机盐值
{
    const char *prefix = "$1$"; // MD5 加密前缀
    char output[128];
    // 使用crypt_gensalt_rn函数（线程安全版本）
    if (crypt_gensalt_rn(prefix, 0, NULL, length, output, sizeof(output)) == NULL)
    {
        LOG_ERROR("crypt_gensalt_rn");
        return "";
    }
    return string(output);
}

string createEncrypt(string password, string salt)
{
    // 此函数运行在服务器上，客户端由Qt生成encrypt
    //  通过密码和盐值生成加密密文，保存到服务器数据库

    // 1. 在栈上分配工作缓冲区
    struct crypt_data data;
    // 2. ！！！关键：初始化缓冲区，将其内存清零
    bzero(&data, sizeof(data));

    // 3. 调用线程安全的 crypt_r
    char *result = crypt_r(password.c_str(), salt.c_str(), &data);

    if (result == NULL)
    {
        LOG_ERROR("crypt_r");
        return "";
    }
    string res(result);
    return res;
}

bool isCodeSame(string encrypClient, string encryptSQL)
{
    // todo这个
    // encrypClient是客户二次计算后得到密文，发送给服务器
    // ncryptSQL是加密密文，存储在服务器上，此处需要从数据库取出
    return encryptSQL == encrypClient;
}

}//end of namespace moqi
